perm filename M[AP,SYS]4 blob sn#015889 filedate 1972-12-23 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00007 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	Start of program: main loop.
 00003 00003	Start of program: main loop.
 00005 00004	Subroutines: TOTS.
 00008 00005	Subroutines: NXTDG.
 00009 00006	Subroutines: START, RESTAR, STOPIT.
 00011 00007	Run INITER on a pty.
 00015 ENDMK
⊗;
;Start of program: main loop.

	TITLE	M

↓CHAR←2
↓AC1 ←3
↓BOT ←4
↓CNT ←5
↓QUO ←6
↓REM ←7
↓DX  ←10
↓BOT ←11
↓BP  ←12
↓CHR ←13
↓CMD ←14
↓A   ←15
↓P   ←17

↓CR←15	↓LF←12	↓ALT←175

PDLEN←30
↓NPNS←200

PDLIST:	BLOCK	PDLEN
NAME:	BLOCK	NPNS*2
COUNT←NAME+1
LTR:	BLOCK	=32

BLANKS:	ASCII	/     /
DIGITS:	BLOCK	4

USERSF:	SIXBIT	/USERS/
	BLOCK	3
IBUF:	BLOCK	3

UCMD:	IOWD	2,NAME+2
	0

WAKEBK:	SIXBIT	/[-AP-]/
	SIXBIT	/ APSYS/
	0

DEFINE CHKANS {
	INCHRW	CHAR
	CAIE	CHAR,"Y"
	CAIN	CHAR,"y"}

OPDEF INWAIT [TTYUUO 14,]
;Start of program: main loop.

FAILED:	OUTSTR	[ASCIZ /	FAILED!
/]

M:	CALLI
	OUTSTR	[ASCIZ/
*/]
	MOVE	P,[IOWD PDLEN,PDLIST]
	MOVE	BP,[POINT 7,CMD]
	SETZ	CMD,
	MOVEI	CNT,5
	JRST	GETCH
PUTCH:	SOJL	CNT,GETCH
	TLZ	CHR,40
	IDPB	CHR,BP
GETCH:	INCHWL	CHR
	CAIE	CHR,CR
	JRST	PUTCH
	INCHWL	CHR
	CAIE	CHR,LF
	JRST	BADCMD

	CAMN	CMD,[ASCII /START/]
	JRST	START

	CAMN	CMD,[ASCII /STOP /]
	JRST	STOPIT

	CAMN	CMD,[ASCII /REST /]
	JRST	RESTAR

	CAMN	CMD,[ASCII /USERS/]
	JRST	TOTS

BADCMD:	OUTSTR	[ASCIZ /
?ILLEGAL COMMAND
/]
	JRST	M
DONE:	OUTSTR	[ASCIZ /DONE/]
	CALLI	12			;EXIT
;Subroutines: TOTS.

	BEGIN	TOTS
↑TOTS:	OUTSTR	[ASCIZ/

/]
	MOVEI	BOT,2
	SETZM	COUNT
	SETZM	NAME
	INIT	0,10
	SIXBIT	/DSK/
	IBUF
	HALT	.
	SETZM	USERSF+3
	LOOKUP	0,USERSF
	JRST	FAILED
GETNAM:	SOSG	IBUF+2
	IN	0,
	JRST	[ILDB AC1,IBUF+1	;GET PN
		 ILDB CNT,IBUF+1	;GET COUNT FIELD FOR THIS PN
		 SOS  IBUF+2
		 JUMPN AC1,FIND
		 JRST GETNAM]
	STATO	0,20000	
	HALT	.
	RELEAS	0,
EOF:	MOVNI	AC1,-2(BOT)
	HRLM	AC1,UCMD
	CAILE	BOT,2
	JRST	NNN
	OUTSTR	[ASCIZ /
NO USERS YET.
/]
	JRST	DONE

FIND:
	MOVE	DX,BOT
NEXT:	SUBI	DX,2
	CAME	AC1,NAME(DX)
	JUMPG	DX,NEXT
	JUMPN	CNT,.+2			;IS THE COUNT FIELD ZERO?
	MOVEI	CNT,1			;YES. IMPLICIT COUNT OF 1.
	ADDM	CNT,COUNT		;ADD TO TOTAL COUNT OF PNs
	JUMPLE	DX,INSERT
	ADDM	CNT,COUNT(DX)
	JRST	GETNAM
INSERT:	CAIL	BOT,2*NPNS
	JRST	[OUTSTR [ASCIZ / TOO MANY PNS.  /]
		 JRST	FAILED]
	MOVEM	AC1,NAME(BOT)
	MOVEM	CNT,COUNT(BOT)
	ADDI	BOT,2
	JRST	GETNAM

PRNTNX:	OUTSTR	NAME(BOT)
	MOVE	BP,[POINT 7,DIGITS]
	MOVE	QUO,COUNT(BOT)
	PUSHJ	P,NXTDG
	MOVEI	QUO,CR
	IDPB	QUO,BP
	MOVEI	QUO,LF
	IDPB	QUO,BP
	MOVEI	QUO,0
	IDPB	QUO,BP
	OUTSTR	BLANKS
NNN:	SUBI	BOT,2
	JUMPGE	BOT,PRNTNX
	INIT	0,17
	SIXBIT	/DSK/
	0
	HALT	.	
	SETZM	USERSF+1
	SETZM	USERSF+2
	SETZM	USERSF+3
	ENTER	0,USERSF
	JRST	[OUTSTR [ASCIZ /
No new file written.
/]
		 JRST FIN]
	OUT	0,UCMD
	JRST	FIN
	RELEAS	0,3
	OUTSTR	[ASCIZ /
OUT UUO failed for new file.
/]
	JRST	DONE
FIN:	RELEAS	0,
	JRST	DONE
	BEND
;Subroutines: NXTDG.

NXTDG:	IDIVI	QUO,=10
	PUSH	P,REM
	SKIPE	QUO
	PUSHJ	P,NXTDG
	POP	P,QUO
	ADDI	QUO,60
	IDPB	QUO,BP
	POPJ	P,
;Subroutines: START, RESTAR, STOPIT.

	BEGIN	STOPIT

↑START:	MOVEI	AC1,WAKEBK
	SETZM	WAKEBK+2	;set wakeup value to NOW
	CALLI	AC1,400061	;WAKEME
	JRST	FAILED
	JRST	DONE

↑RESTAR:SETOM	STARTUP#
	JRST	STOP1

REST2:	OUTSTR	[ASCIZ/STOPPED.../]
	MOVEI	AC1,=8
	CALLI	AC1,31		;SLEEP for 8 seconds
	OUTSTR	[ASCIZ/STARTING.../]
	JRST	START

↑STOPIT:SETZM	STARTUP
	MOVEI	AC1,WAKEBK
	SETOM	WAKEBK+2	;set wakeup value to NEVER
	CALLI	AC1,400061	;WAKEME
	JRST	FAILED

STOP1:	
	PPIOT	6,-2000			;move line editor position off screen
	CALLI	400001			;CTLV.  turn off duplexing
	OUTCHR	["."]
	INWAIT
	CALLI	400001			;CTLF.  turn on duplexing
	PPIOT	6,			;replace line editor in standard position

	MOVE	BP,[POINT 7,LTR]
	MOVEI	CNT,5*=32
	JRST	LOACHR

STOCHR:	SOJLE	CNT,.+2
	IDPB	CHR,BP	

LOACHR:	INCHWL	CHR
	CAIE	CHR,ALT
	JRST	STOCHR

	SETZ	CHR,
	IDPB	CHR,BP
	MOVEI	A,DONE
	SKIPE	STARTUP
	MOVEI	A,REST2

TEST:	MAIL	5,[SIXBIT /[-AP-]/
		   LTR]
	JRST	FAILED
	JRST	(A)
	OUTSTR	[ASCIZ /
[-AP-] does not exist!
/]
	JRST	FAILED

	BEND	STOPIT
;Run INITER on a pty.

MKNEWS:	RELEAS	0,
	PTYGET	PINITE		;start up INITER on a PTY
	UBIGERR	44	;	;COULD NOT GET A PTY TO START UP INITER
	MOVEI	A,PINITE+2
	MOVEM	A,PINITE+1
	PTWRS7	PINITE
CTRLC:	PTRD1W	PINITE
	MOVE	A,PINITE+1	;read char from pty
	CAIE	A,136		;read from pty until ↑
	JRST	CTRLC
	PTRD1W	PINITE
	MOVE	A,PINITE+1
	CAIE	A,103		;	and C
	JRST	CTRLC
GETDOT:	PTRD1W	PINITE
	MOVE	A,PINITE+1
	CAIE	A,56		;read from pty until find period (monitor level)
	JRST	GETDOT

;Create NEWS and INDEX files.

	OPEN	0,DSK17		;prepare to create new NEWS file
	UBIGERR	50	;	;OPEN FAILED ON DSK
	SETZM	NEWSF+1
	SETZM	NEWSF+2
	SETZM	NEWSF+3
	OUTSTR	[ASCIZ / MAKING-NEWS /]
	ENTER	0,NEWSF		;create NEWS file
	UBIGERR	54	;	;ENTER FAILED DURING ATTEMPT TO CREATE NEWS FILE
	SETZM	BUF		;zero the first word in the story buffer
	OUT	0,CMD		;write out 1 zero word in NEWS
	JRST	.+2
	UBIGERR	60	;	;OUT UUO FAILED ATTEMPTING TO INITIALIZE NEWS FILE
	PUSHJ	P,GROW		;expand to full core size
	OPEN	1,DSK17		;prepare to create INDEX file
	UBIGERR	64	;	;OPEN FAILED ON DSK
	SETZM	INDEXF+1
	SETZM	INDEXF+2
	SETZM	INDEXF+3
	ENTER	1,INDEXF	;INDEX file
	UBIGERR	70	;	;ENTER FAILED DURING ATTEMPT TO CREATE INDEX FILE
	MOVEI	UNDUN,XSIZE+SPECS;initialize special pointers
	MOVEM	UNDUN,INDEX
	MOVEI	NEW,XSIZE+SPECS
	MOVEM	NEW,INDEX+1
	MOVEI	OLD,SPECS
	MOVEM	OLD,INDEX+2
	MOVE	A,[XWD 1,4000]
	MOVEM	A,INDEX+1(NEW)	;initialize index information for NEW area
	MOVE	A,[XWD 10,4000]
	MOVEM	A,INDEX+1(OLD)	;initialize index information for OLD area
	OUT	1,XCMD		;write out INDEX file
	JRST	.+2
	UBIGERR	74	;	;OUT UUO FAILED TO WRITE OUT INITIAL INDEX FILE
	PUSHJ	P,SHRINK	;minimize core size
	ADDI	BPTR,1		;increase byte pointer beyond 1-word short story
INITED:	PTRD1W	PINITE		;get a char from INITER
	MOVE	A,PINITE+1
	CAIE	A,36		;is char a "≡"?
	JRST	INITED		;no
	PTRD1W	PINITE		;yes.  get another char
	MOVE	A,PINITE+1
	CAIE	A,41		;is char a "!"?
	UBIGERR	100	;	;INITER DETECTED AN ERROR AND DIDN'T FINISH
	PTYREL	PINITE		;yes.  INITER is done.  release its PTY.
	RELEAS	1,		;INDEX file after INITER has succeeded

	END	M